package com.carefree.system.modules.security.entity;

import lombok.Data;
import org.springframework.security.core.authority.SimpleGrantedAuthority;

import java.util.List;

/**
 * @ClassName:RedisUserDetails
 * @Description: 存在reids中的用户认证对象
 * @Author Tengbin tengbin234@163.com
 */
@Data
public class RedisUserDetails {

    /**
     * token
     * 说明:
     * 1.严格来说，使用jwt是不用redis的，因为jwt初衷就是为了无状态，你加上redis，就违背了初衷
     * 2.使用redis并不是为了减轻数据库的压力，因为jwt本身是可以在payload中放入一些用户基本信息的，
     * 3.由于jwt的无状态，后端是没法感知和控制用户的在线状态的，所以加入了redis这一层，在校验token的同时检查redis相关状态从而实现后端对用户状态的控制
     * 4.无状态应用，jwt是再好不过的; 常见的有状态应用，使用一个uuid也是能达到相同的效果
     */
    private String token;

    /**
     * 对应的权限列表
     * 说明:
     * 1.权限列表可存入redis中也可以不存入,看个人需求
     * 2.此处也可以改为从数据库查出来并处理后的字符串权限列表,如CustomUserDetails对象中的List<String> permissionList
     * 3.此处之所以使用Security的权限列表仅仅只是为了:
     * 减少从redis获取权限列表的时候还要对获取到的字符串list集合进行遍历,然后挨个 add 到 List<SimpleGrantedAuthority> 中
     * 如果使用List<String> permissionList存入redis中,那么就需在获取的时候加上: permissionList.forEach(permission -> authorities.add(new SimpleGrantedAuthority(permission.trim())));
     */
    private List<SimpleGrantedAuthority> authorities;
}
